revert_remove_our_use_of_syscall_for-statx
authorDebian Qt/KDE Maintainers <debian-qt-kde@lists.debian.org>
Fri, 15 Mar 2019 07:20:39 +0000 (07:20 +0000)
committerDmitry Shachnev <mitya57@debian.org>
Fri, 15 Mar 2019 07:20:39 +0000 (07:20 +0000)
Gbp-Pq: Name revert_remove_our_use_of_syscall_for-statx.patch

src/corelib/global/minimum-linux_p.h
src/corelib/io/qfilesystemengine_unix.cpp

index 9c074e13ba7610081598e4b71f92b836bd1b60ec..bad2488b4de345bf93aa2d28f277c16e2d1e08e5 100644 (file)
@@ -75,14 +75,9 @@ QT_BEGIN_NAMESPACE
  * - accept4                    2.6.28
  * - renameat2                  3.16                    QT_CONFIG(renameat2)
  * - getrandom                  3.17                    QT_CONFIG(getentropy)
- * - statx                      4.11                    QT_CONFIG(statx)
  */
 
-#if QT_CONFIG(statx)
-#  define MINLINUX_MAJOR        4
-#  define MINLINUX_MINOR        11
-#  define MINLINUX_PATCH        0
-#elif QT_CONFIG(getentropy)
+#if QT_CONFIG(getentropy)
 #  define MINLINUX_MAJOR        3
 #  define MINLINUX_MINOR        17
 #  define MINLINUX_PATCH        0
index 7a77f982380860bd9a030aeff4098ddd2215a818..7c731afca622ef9d7744aefbfd0a028823359335 100644 (file)
@@ -1,6 +1,6 @@
 /****************************************************************************
 **
-** Copyright (C) 2018 Intel Corporation.
+** Copyright (C) 2017 Intel Corporation.
 ** Copyright (C) 2016 The Qt Company Ltd.
 ** Copyright (C) 2013 Samuel Gaist <samuel.gaist@edeltech.ch>
 ** Contact: https://www.qt.io/licensing/
@@ -88,6 +88,7 @@ extern "C" NSString *NSTemporaryDirectory();
 
 #if defined(Q_OS_LINUX)
 #  include <sys/ioctl.h>
+#  include <sys/syscall.h>
 #  include <sys/sendfile.h>
 #  include <linux/fs.h>
 
@@ -95,6 +96,28 @@ extern "C" NSString *NSTemporaryDirectory();
 #ifndef FICLONE
 #  define FICLONE       _IOW(0x94, 9, int)
 #endif
+
+#  if defined(Q_OS_ANDROID)
+// renameat2() and statx() are disabled on Android because quite a few systems
+// come with sandboxes that kill applications that make system calls outside a
+// whitelist and several Android vendors can't be bothered to update the list.
+#    undef SYS_renameat2
+#    undef SYS_statx
+#    undef STATX_BASIC_STATS
+#  else
+#    if !QT_CONFIG(renameat2) && defined(SYS_renameat2)
+static int renameat2(int oldfd, const char *oldpath, int newfd, const char *newpath, unsigned flags)
+{ return syscall(SYS_renameat2, oldfd, oldpath, newfd, newpath, flags); }
+#    endif
+
+#    if !QT_CONFIG(statx) && defined(SYS_statx)
+#      include <linux/stat.h>
+static int statx(int dirfd, const char *pathname, int flag, unsigned mask, struct statx *statxbuf)
+{ return syscall(SYS_statx, dirfd, pathname, flag, mask, statxbuf); }
+#    elif !QT_CONFIG(statx) && !defined(SYS_statx)
+#      undef STATX_BASIC_STATS
+#    endif
+#  endif // !Q_OS_ANDROID
 #endif
 
 #if defined(Q_OS_ANDROID)
@@ -315,8 +338,22 @@ mtime(const T &statBuffer, int)
 #ifdef STATX_BASIC_STATS
 static int qt_real_statx(int fd, const char *pathname, int flags, struct statx *statxBuffer)
 {
+#ifdef Q_ATOMIC_INT8_IS_SUPPORTED
+    static QBasicAtomicInteger<qint8> statxTested  = Q_BASIC_ATOMIC_INITIALIZER(0);
+#else
+    static QBasicAtomicInt statxTested = Q_BASIC_ATOMIC_INITIALIZER(0);
+#endif
+
+    if (statxTested.load() == -1)
+        return -ENOSYS;
+
     unsigned mask = STATX_BASIC_STATS | STATX_BTIME;
     int ret = statx(fd, pathname, flags, mask, statxBuffer);
+    if (ret == -1 && errno == ENOSYS) {
+        statxTested.store(-1);
+        return -ENOSYS;
+    }
+    statxTested.store(1);
     return ret == -1 ? -errno : 0;
 }
 
@@ -1252,12 +1289,14 @@ bool QFileSystemEngine::renameFile(const QFileSystemEntry &source, const QFileSy
     if (Q_UNLIKELY(srcPath.isEmpty() || tgtPath.isEmpty()))
         return emptyFileEntryWarning(), false;
 
-#if defined(RENAME_NOREPLACE) && QT_CONFIG(renameat2)
+#if defined(RENAME_NOREPLACE) && (QT_CONFIG(renameat2) || defined(SYS_renameat2))
     if (renameat2(AT_FDCWD, srcPath, AT_FDCWD, tgtPath, RENAME_NOREPLACE) == 0)
         return true;
 
+    // If we're using syscall(), check for ENOSYS;
+    // if renameat2 came from libc, we don't accept ENOSYS.
     // We can also get EINVAL for some non-local filesystems.
-    if (errno != EINVAL) {
+    if ((QT_CONFIG(renameat2) || errno != ENOSYS) && errno != EINVAL) {
         error = QSystemError(errno, QSystemError::StandardLibraryError);
         return false;
     }